package com.my12306.train.model.entity;

import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import javax.validation.constraints.NotNull;
import java.io.Serializable;
import java.util.Date;

/**
 * @author ËÕÄÁÏ¦
 * @email
 * @date 2020-07-24 20:58:07
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
@TableName("my_mileage")
public class MileageEntity implements Serializable {
    private static final long serialVersionUID = 1L;

    /**
     * id
     */
    @TableId
    @NotNull
    private Long mileageId;
    /**
     * 父id
     * -1：代表是线路的起点和重点里程 (整条线路总里程)
     * 非-1：代表该里程承接着线路中的上一段里程
     * 比如深圳-汕尾 (总线路)
     * 中转站有 惠州、广州
     * 可以分为几条数据
     * 深圳-汕尾(全程) id=1 父id=-1   根据Id=1
     * 深圳-惠州  id=2  父id=1       根据Id=1
     * 惠州-广州  id=3 父id=2        根据Id=1
     * 广州-汕尾  id=4 父id= 3       根据Id=1
      */
    private Long parentId;
    /**
     * 线路id 主要是为了方便统一检索某条线路的所有经过的站点(也可以统计时刻表)
     * 线路id 不是等于里程id则证明该条里程是经过站点并不是起始站
     * 最后根据终点站与该routeId对于的里程比较则可以得出该里程的终点站是否是该线路的终点站
     */
    @NotNull
    private Long routeId;
    /**
     * 起始站id
     */
    @NotNull
    private Long fromId;
    /**
     * 起始站名称
     */
    private String fromName;
    /**
     * 终点站id
     */
    @NotNull
    private Long toId;
    /**
     * 终点站名称
     */

    private String toName;
    /**
     * 总里程-单位千米
     */
    private Double totalMileage;
    /**
     * 里程状态：0-经过站-经过站，1-起始站-终点站，2-起始站-经过站，3-经过站-终点站
     * 添加数据时自动处理。
     */
    private Integer mileageType;
    /**
     * 显示状态 0-表示禁用 1-表示正常
     */
    private Integer showStatus;
    /**
     * 逻辑删除 0-表示删除，1-表示正常
     */
    private Integer logicDelete;
    /**
     * 注册时间
     */
    private Date createDate;
    /**
     * 修改时间
     */
    private Date updateDate;
    /**
     * 版本号
     */
    private Integer version;

    public MileageEntity(MielageBuilder mielageBuilder){
        this.mileageId = mielageBuilder.mileageId;
        this.parentId = mielageBuilder.parentId;
        this.routeId = mielageBuilder.routeId;
        this.fromId = mielageBuilder.fromId;
        this.fromName = mielageBuilder.fromName;
        this.toId = mielageBuilder.toId;
        this.toName = mielageBuilder.toName;
        this.totalMileage = mielageBuilder.totalMileage;
        this.mileageType = mielageBuilder.mileageType;
        this.showStatus = mielageBuilder.showStatus;
        this.logicDelete = mielageBuilder.logicDelete;
        this.createDate = mielageBuilder.createDate;
        this.updateDate = mielageBuilder.updateDate;
        this.version = mielageBuilder.version;
    }
    public static class MielageBuilder{

        /**
         * id
         */
        private Long mileageId;
        /**
         * 父id
         * -1：代表是线路的起点和重点里程 (整条线路总里程)
         * 非-1：代表该里程承接着线路中的上一段里程
         * 比如深圳-汕尾 (总线路)
         * 中转站有 惠州、广州
         * 可以分为几条数据
         * 深圳-汕尾(全程) id=1 父id=-1   根据Id=1
         * 深圳-惠州  id=2  父id=1       根据Id=1
         * 惠州-广州  id=3 父id=2        根据Id=1
         * 广州-汕尾  id=4 父id= 3       根据Id=1
         */
        private Long parentId;
        /**
         * 线路id 主要是为了方便统一检索某条线路的所有经过的站点(也可以统计时刻表)
         * 线路id 不是等于里程id则证明该条里程是经过站点并不是起始站
         * 最后根据终点站与该routeId对于的里程比较则可以得出该里程的终点站是否是该线路的终点站
         */
        private Long routeId;
        /**
         * 起始站id
         */
        private Long fromId;
        /**
         * 起始站名称
         */
        private String fromName;
        /**
         * 终点站id
         */
        private Long toId;
        /**
         * 终点站名称
         */
        private String toName;
        /**
         * 总里程-单位千米
         */
        private Double totalMileage;
        /**
         * 里程状态：0-经过站-经过站，1-起始站-终点站，2-起始站-经过站，3-经过站-终点站
         * 添加数据时自动处理。
         */
        private Integer mileageType;
        /**
         * 显示状态 0-表示禁用 1-表示正常
         */
        private Integer showStatus;
        /**
         * 逻辑删除 0-表示删除，1-表示正常
         */
        private Integer logicDelete;
        /**
         * 注册时间
         */
        private Date createDate;
        /**
         * 修改时间
         */
        private Date updateDate;
        /**
         * 版本号
         */
        private Integer version;

        public MielageBuilder mileageId(Long mileageId) {
            this.mileageId = mileageId;
            return this;
        }



        public MielageBuilder parentId(Long parentId) {
            this.parentId = parentId;
            return this;
        }



        public MielageBuilder routeId(Long routeId) {
            this.routeId = routeId;
            return this;
        }

        public MielageBuilder fromId(Long fromId) {
            this.fromId = fromId;
            return this;
        }

        public MielageBuilder fromName(String fromName) {
            this.fromName = fromName;
            return this;
        }


        public MielageBuilder toId(Long toId) {
            this.toId = toId;
            return this;
        }


        public MielageBuilder toName(String toName) {
            this.toName = toName;
            return this;
        }

        public MielageBuilder totalMileage(Double totalMileage) {
            this.totalMileage = totalMileage;
            return this;
        }


        public MielageBuilder mileageType(Integer mileageType) {
            this.mileageType = mileageType;
            return this;
        }

        public MielageBuilder showStatus(Integer showStatus) {
            this.showStatus = showStatus;
            return this;
        }

        public MielageBuilder logicDelete(Integer logicDelete) {
            this.logicDelete = logicDelete;
            return this;
        }
        public MielageBuilder createDate(Date createDate) {
            this.createDate = createDate;
            return this;
        }


        public MielageBuilder updateDate(Date updateDate) {
            this.updateDate = updateDate;
            return this;
        }

        public MielageBuilder version(Integer version) {
            this.version = version;
            return this;
        }
        public MileageEntity builder(){
          return   new MileageEntity(this);
        }
    }
}
